上一篇介紹了很短的程式碼產生一整組 Grid System,然後還提供變數讓 Grid 還有額外的參數可以設定,手寫的 CSS 如果要重新計算 12 組以上的計算也太苦了 T_T,這也就是 Sass 的魅力所在。
Sass 的運用上手法非常多,這次來介紹透過簡單的變數,即可大量產生相似的模組。
Sass map 是類似 json 的一種變數,json 中包含的陣列、物件、屬性在 Sass map 都能有相似的寫法,所以首先要先使用 Sass Map 來定義基礎的元件變數。
$btn-config 裡面包覆的就是 Sass map,與 json 最大的差異是使用 () 取代 {},這樣的手法可以大量的產生樣式的變數。
$gray-light:  #777;
$brand-primary: #009AFF;
$brand-accent: #D84315;
$btn-config:(
	default:(
		class: 'default',
		color: $gray-light,
    bg: #fff,
		border-color: #ccc
	),
	primary:(
		class: 'primary',
		color: #fff,
		bg: $brand-primary,
		border-color: $brand-primary
	),
	accent:(
		class: 'accent',
    color: #fff,
		bg: $brand-accent,
		border-color: $brand-accent
	)
);
接下來我們在製作 @mixin 與 button 的基本樣式,@mixin 可以將產出的 CSS 先寫成公式,在後續的流程在套用,這個公式我是直接抓 Bootstrap 所寫好的。
另外 .btn 則是先前提過好幾次的結構,而這個結構是不包含樣式 (色彩、大小...),樣式的部分是在 @mixin 內。
// @mixin 運算
@mixin button-variant($color, $background, $border) {
  color: $color;
  background-color: $background;
  transition: background-color .15s;
  border-color: $border;
  &:hover,
  &:focus,
  &.focus,
  &:active,
  &.active,
  .open > &.dropdown-toggle {
    color: $color;
    background-color: darken($background, 6%);
    border-color: darken($border, 8%);
  }
  &:active,
  &.active,
  .open > &.dropdown-toggle {
    background-image: none;
  }
  &.disabled,
  &[disabled],
  fieldset[disabled] & {
    &,
    &:hover,
    &:focus,
    &.focus,
    &:active,
    &.active {
      background-color: $background;
      border-color: $border;
    }
  }
  .badge {
    color: $background;
    background-color: $color;
  }
}
// 基本 btn 結構
.btn {
  // 結構
  display: inline-block;
  padding: 6px 12px;
  margin-bottom: 0;
  font-size: 14px;
  text-align: center;
  vertical-align: middle;
  cursor: pointer;
  user-select: none;
  background-image: none;
  border: 1px solid transparent;
  border-radius: 4px;
  &:hover, &:focus {
    color: #333;
    background-color: #e6e6e6;
  }
}
@eachSass @each 也是像 javascript 中的 each,將 $btn-config 中的物件一一讀出(使用 map-get($value, value)),然後在 @include 上一段所產生的 @mixin。
這樣就能一次產生出大量的 CSS 樣式,所依據的就是先前所設定好的 Sass map,這範例僅使用三種樣式,相同的觀念下我們可以用這方法產出更多的樣式在內,只需要修改 Sass map 即可,不需要改其他部分。
@each $name, $value in $btn-config {
  $class: map-get($value, class);
  $color: map-get($value, color);
  $bg: map-get($value, bg);
  $border-color: map-get($value, border-color);
  .btn-#{$class}{
    @include button-variant($color, $bg, $border-color);
  }
}
範例如下:http://codepen.io/Wcc723/pen/qqwGdm/
現在的 CSS 大多會使用 Sass、Less、PostCSS 來做管理,使用哪一種語言倒是無所謂,但建議先從一種入門到熟悉,會發現省去許多不必要的時間,且在管理上會容易許多。
文章同時發表於:https://wcc723.github.io/css/2016/12/25/sass-map/
請問卡斯伯大大,
那個什麼什麼.map 是做什麼用的?
常看到,但卻不知道-.-
你說的是哪個 .map 呢!?
這篇我介紹的是 Sass map,可以參考:https://www.sitepoint.com/using-sass-maps/
另外還有一種叫做 Source map,可以從產出的結果找出原始黨的位置,這段可以看:http://ithelp.ithome.com.tw/articles/10159158